package com.sky.controller.user;

import com.sky.constant.MessageConstant;
import com.sky.dto.OrderSubmitDTO;
import com.sky.dto.OrderPaymentDTO;
import com.sky.result.PageBean;
import com.sky.result.Result;
import com.sky.service.OrderService;
import com.sky.utils.ThreadLocalUtil;
import com.sky.vo.OrderPaymentVO;
import com.sky.vo.OrderSubmitVO;
import com.sky.vo.OrderVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.UnsupportedEncodingException;

/**
 * C端订单控制器
 *
 * @Author Vsunks.v
 * @Date 2023/5/9 10:54
 * @Blog blog.sunxiaowei.net/996.mba
 * @Description: C端订单控制器
 */
@Slf4j
@RequestMapping("/user/order")
@RestController("userOrderController") // 手动指定beanId，避免重名造成Spring容器启动失败
public class OrderController {

    @Autowired
    OrderService orderService;

    /**
     * 用户下单
     *
     * @param orderSubmitDTO 用户订单详情
     * @return
     */
    @PostMapping("/submit")
    public Result<OrderSubmitVO> submit(@RequestBody OrderSubmitDTO orderSubmitDTO) throws UnsupportedEncodingException {
        // 记录日志

        // 参数校验

        // 调用service下单获取返回值，并给出响应
        return orderService.submit(orderSubmitDTO);
    }

    /**
     * 订单支付
     *
     * @param ordersPaymentDTO
     * @return
     */
    @PutMapping("/payment")
    public Result<OrderPaymentVO> payment(@RequestBody OrderPaymentDTO ordersPaymentDTO) throws Exception {
        log.info("订单支付：{}", ordersPaymentDTO);
        OrderPaymentVO orderPaymentVO = orderService.payment(ordersPaymentDTO);
        log.info("生成预支付交易单：{}", orderPaymentVO);
        return Result.success(orderPaymentVO);
    }

    /**
     * 历史订单查询
     *
     * @param page     页码
     * @param pageSize 页面大小
     * @param status   订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消
     * @return
     */
    @GetMapping("/historyOrders")
    public Result<PageBean> pageQuery4User(int page, int pageSize, Integer status) {
        // 记录日志
        log.info("C端用户查询订单，用于ID：{}", ThreadLocalUtil.getCurrentId());

        // 调用service获取返回值，并给出响应
        return Result.success(orderService.pageQuery4User(page, pageSize, status));
    }

    /**
     * 根据订单id查询订单（含订单详情）
     *
     * @param id 订单Id
     * @return 指定id的订单（含订单详情）
     */
    @GetMapping("/orderDetail/{id}")
    public Result<OrderVO> findByIdWithDetails(@PathVariable("id") Long id) {
        // 记录日志
        log.info("根据订单id查询订单（含订单详情），订单id：{}", id);

        // 参数校验

        // 调用service获取返回值，并给出响应
        return Result.success(orderService.findByIdWithDetails(id));
    }


    /**
     * 用户取消订单，根据id取消订单
     *
     * @param id 订单id
     * @return
     */
    @PutMapping("/cancel/{id}")
    public Result userCancelById(@PathVariable("id") Long id) throws Exception {
        // 记录日志
        log.info("用户(id:{})取消订单，根据id(:{})取消订单", ThreadLocalUtil.getCurrentId(), id);

        // 参数校验

        // 调用service获取返回值，并给出响应
        if (orderService.userCancelById(id)) {
            return Result.success(MessageConstant.ORDER_CANCLE_SUCCESS);
        }
        return Result.error(MessageConstant.ORDER_CANCLE_FAIL);
    }


    /**
     * 再来一单
     *
     * @param id 被复制的订单id
     * @return
     */
    @PostMapping("/repetition/{id}")
    public Result repetition(@PathVariable Long id) {
        // 记录日志
        log.info("再来一单,被复制的订单id为：{}", id);

        // 参数校验

        // 调用service获取返回值，并给出响应
        orderService.repetition(id);
        return Result.success();
    }

    /**
     * C端用户催单
     *
     * @param id 订单id
     * @return 是否成功
     */
    @GetMapping("/reminder/{id}")
    public Result reminderById(@PathVariable Long id) {
        // 记录日志
        log.info("C端用户催单，订单id为{}", id);

        // 参数校验

        // 调用service获取返回值，并给出响应
        if (orderService.reminderById(id)) {
            return Result.success(MessageConstant.ORDER_REMINDER_SUCCESS);
        }
        return Result.error(MessageConstant.ORDER_REMINDER_FAIL);
    }
}
